package com.zookeeper.demo1;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;


/**
 * zookeeper原生的客户端操作
 */
public class ZookeeperClient {

    // 连接服务端，连接地址可以写多个，比如"127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"
    // 当客户端与服务端的连接断掉后就会重试去连其他的服务器地址
    // watcher

    // 初始化timeout
    // 启动SendThread(socket, 初始化， 读写事件, 发送时), EventTrhead
    // outgoingqueue packet pendingqueue

    /**
     * connectString 连接地址可以写多个，比如"127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183",当客户端与服务端的Socket连接断掉后就会重试去连其他的服务器地址
     * sessionTimeout 客户端设置的话会超时时间
     * watcher 监听器
     */
    public static void main(String[] args) throws Exception {


        ZooKeeper zooKeeper = new ZooKeeper("192.168.93.10:2181", 60 * 1000, new Watcher() {
            public void process(WatchedEvent event) {
                System.out.println(event.getPath());
                System.out.println(event);
            }
        });


        // 创建一个节点，并设置内容，设置ACL(该节点的权限设置)，
        // 节点类型（7种：持久节点、临时节点、持久顺序节点、临时顺序节点、容器节点、TTL节点、TTL顺序节点）
        /**
         * 创建的节点类型枚举
         * PERSISTENT:持久化节点
         * PERSISTENT_SEQUENTIAL:持久化顺序节点
         * EPHEMERAL:临时节点
         * EPHEMERAL_SEQUENTIAL:临时顺序节点
         * CONTAINER:容器节点
         * PERSISTENT_WITH_TTL:TTL节点
         * PERSISTENT_SEQUENTIAL_WITH_TTL：顺序的TTL节点
         */


//        String s = zooKeeper.create("/p01", "p01_0000".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//        System.out.println("创建的持久化节点："+s);

        //创建持久化顺序节点和获取节点内容
//        String s1 = zooKeeper.create("/e_01", "e01_1111".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
//        System.out.println("创建的持久化顺序节点："+s1);
//        Stat stat = new Stat();
//        byte[] data = zooKeeper.getData(s1, false, stat);
//        System.out.println("创建的持久化临时节点内容为="+new String(data));
//        System.out.println("状态为:"+stat);

        //判断节点是否存在
       // Stat exists = zooKeeper.exists("/bml", false);
       // System.out.println("节点存在状态：" + exists);

        // 修改节点的内容，这里有乐观锁,version表示本次修改, -1表示不检查版本强制更新
        // stat表示修改数据成功之后节点的状态
        //System.out.println(zooKeeper.setData("/bml", "0000000001".getBytes(), -1));

        //删除节点
        // zooKeeper.delete("/e_010000000011",-1);

        //创建子节点
        //  String s = zooKeeper.create("/bml/ccc", "cc3333".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        //获取子节点
//        List<String> children = zooKeeper.getChildren("/bml", false);
//        System.out.println(children);

        //给节点添加监听(一次性监听）,只能监听当前节点的变化和删除事件，并且只能监听一次
//        Stat  stat = new Stat();
//        byte[] data = zooKeeper.getData("/bml", new Watcher() {
//            public void process(WatchedEvent event) {
//                System.out.println("监听到节点变化="+event);
//            }
//        }, stat);

//        System.out.println("data="+new String(data));
//        System.out.println("状态="+stat);
//        System.in.read();
//

        // 给/bml节点绑定了一个监听，用来监听节点的子节点的变化，子节点的增加和删除
        //也是一个一次性事件，只能监听子节点的删除，增加，但是只监听一次，一次过后不再监听

//        zooKeeper.getChildren("/bbb", new Watcher() {
//            public void process(WatchedEvent watchedEvent) {
//                System.out.println(watchedEvent);
//                System.out.println(watchedEvent.getState().getIntValue());
//                System.out.println(watchedEvent.getType().getIntValue());
//            }
//        });
        zooKeeper.exists("/bbb/ps_0000000000", new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println(222);
            }
        });

        zooKeeper.exists("/bbb/ps_0000000000", new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println(33333);
            }
        });
        System.in.read();



        //// 给/xxx节点绑定了一个监听，用来监听节点的创建事件,仅仅 只是创建事件
//        zooKeeper.exists("/xxx", new Watcher() {
//            public void process(WatchedEvent watchedEvent) {
//                System.out.println(watchedEvent);
//            }
//        });

        //给/bml111节点绑定了一个持久化监听，可以监听节点的创建、删除、修改、增加子节点、删除子节点事件
//        zooKeeper.addWatch("/bml111", new Watcher() {
//            public void process(WatchedEvent watchedEvent) {
//                System.out.println(watchedEvent);
//            }
//        },AddWatchMode.PERSISTENT);
//        System.in.read();
        // 给/bml111节点绑定了一个持久化监听，可以监听节点的创建、删除、修改、增加子节点、删除子节点事件
        // 并且还会监听/bml111的所有子节点的变化，包括子节点的创建、删除、修改
//        zooKeeper.addWatch("/bml111", new Watcher() {
//            public void process(WatchedEvent watchedEvent) {
//                System.out.println(watchedEvent);
//            }
//        },AddWatchMode.PERSISTENT_RECURSIVE);
//        System.in.read();

//        zooKeeper.create("/bml/ss_", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
//                CreateMode.PERSISTENT_SEQUENTIAL, new AsyncCallback.StringCallback() {
//                    public void processResult(int i, String s, Object o, String s1) {
//                        System.out.println(i); // 命令执行结果，可以参考KeeperException.Code枚举
//                        System.out.println(s); // 传入的path
//                        System.out.println(o); // 外部传进来的ctx
//                        System.out.println(s1);// 创建成功后的path，比如顺序节点
//                    }
//                }, "ctx");
//        System.in.read();
    }
}
